//设两个数组相加后的程度为M，其中位数为第K个
//如果M为奇数，K = (M + 1) / 2
//如果M为偶数，中位数为 M / 2 和 (M / 2) + 1的平均值
//那么实际上，该问题求的就是两个数组中第K小的数

class Solution {
    //获得nums1和nums2合计第K小的元素
    int getKthElement(const vector<int>& nums1, const vector<int>& nums2, int k)
    {
        int m = nums1.size(), n = nums2.size();
        int index1 = 0, index2 = 0;

        while (true)
        {
            //防止数组为空导致越界
            if (index1 == m)
                return nums2[index2 + k - 1];
            if (index2 == n)
                return nums1[index1 + k - 1];

            //k == 1，说明取第一个最小值即可
            if (k == 1)
                return min(nums1[index1], nums2[index2]);

            int newIndex1 = min(index1 + k / 2 - 1, m - 1);
            int newIndex2 = min(index2 + k / 2 - 1, n - 1);
            int point1 = nums1[newIndex1], point2 = nums2[newIndex2];

            if (point1 <= point2)
            {
                k -= newIndex1 - index1 + 1;
                index1 = newIndex1 + 1;
            }
            else
            {
                k -= newIndex2 - index2 + 1;
                index2 = newIndex2 + 1;
            }
        }

    }
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int totalNums = nums1.size() + nums2.size();
        if (totalNums % 2)
            return getKthElement(nums1, nums2, (totalNums + 1) / 2);
        else
            return (getKthElement(nums1, nums2, totalNums / 2) + getKthElement(nums1, nums2, totalNums / 2 + 1)) / 2.0;
    }
};